The Intrinsic Functions

Lcc-win32 offers a series of pseudo-functions that use the call syntax function, but which will trigger the emission of an inlined assembly macro. These macros do not have the overhead of the function call instruction and spare the cost of setting up and destroying a procedure frame. They can be used only if the file « intrinsics.h » is present in the compilation unit.

 

Name

Description

long long _rdtsc(void)

Returns a long long integer (64 bits) containing the number of cycles that the machine has done since it was turned on. Since this counter is automatically incremented at each cycle,  to get a time in seconds you have to divide by the clock speed of your machine. For example if you divide the value by 166 x 1e6 you get the number of seconds elapsed for a 166 MHz machine. This intrinsic value will use up some cycles for converting the 64 bit value into a floating point number, so there will be an overhead of at most 1000 cycles: at 200 MHz this should be 5 millionths of a second.

int _bswap(long)

Returns the byte swapped long integer.

double _fsicncos(arg,cos *)

Returns sin(arg), and stores the cosine in the address pointed by cos *.

double _fcos(double)

Returns the cosinus of its argument.

double _fsin(double)

Returns the sinus of its argument.

double _fldpi(void)

Returns the constant pi in floating point format.

double _fldl2e(void)

Returns the logarithm base 2 of e.

double _fldlg2(void)

Returns the logarithm base 10 of e.

double _fldln2(void)

Returns the natural logarithm (base e) of 2.

int _carry(void)

Returns the carry flag as an integer. This value is VERY volatile, since most calculations set/unset it. You should not assume that the value returned is the value of the last C instruction performed, since the lcc’s optimizer could re-arrange the instructions. The best way to do this is to write only one operation, immediately followed by an assignment expression. For example you should write:

a = b+c;

instead of

a = b+foo(5)+78;

If you test the carry/overflow flag at the end of a complicated expression, you cannot know the exact operation that produced the error. Besides, since many operations change this flag, an actual overflow could be hidden by the operations that follow it.

 

int _fistp(arg)

Returns a long integer from the given double using the rounding mode that is in effect at the time of the call. Normally this should be rounding to nearest number, since lcc-win32 never changes this setting. This allows for very fast rounding. Remember that to satisfy the rules of ANSI C, lcc-win32 is forced to set the rounding to truncation, round the figure, and then restore the original mode. This can be avoided by using this intrinsic function to round floating point data.

int _overflow(void)

Returns the value of the overflow flag. The same considerations apply as to the carry() function above.

int rint(double) 

Rounds the given floating point number to an integer using the current rounding mode. By default, the rounding mode is round to nearest number. To use this, you should include <math.h>.

int _bsr(long)

Returns an integer with the index of the first non-zero bit in the given integer, starting with the most significant bit.

int _bsf(long)

Returns an integer with the index of the first non-zero bit in the given integer starting with the least significant bit.

 

Lcc-win32 offers special macros for all MMX instructions. Please refer to the associated documentation.